<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    
    <title>DDE 后端 Tutorial | jouyouyun&#39;s blog</title>
    <meta name="viewport" content="width=device-width,minimum-scale=1">
    <meta name="description" content="dde 后端使用 go 作为主要的开发语言，使用 dbus 提供接口，主要使用 gsettings 来保存配置。所以在进行后端开发前需要对以上内容有基本的了解，这里假定本文档的阅读者熟悉 dbus 和 gsettings ，并有一定的开发经验。
这里就只对 go 进行简单的介绍。
go go 是一种类 c 的语言，但没有了 c 中令人头疼的指针和内存管理问题，极大的提高了开发效率。 go 中使用 package 来封装同一功能的模块，首字母大写的变量和函数是可以被其它 package 使用的。
学习 go 至少需要了解以下内容。
编码风格 go 提供了 gofmt 工具来对代码进行格式化，以使用统一的代码风格。因此在代码保存之前需要使用 gofmt 先进行格式化。
保存前格式化这种操作，一般可在编辑器中配置，如 vim , emacs 等，根据个人习惯选择编辑器。
变量 go 支持使用时声明和使用 var 声明两种方式，如下：
使用 var 声明 // 主动声明 var ( outData []byte err error ) outData, err = os.Exec(&#34;ls&#34;).Output() 使用时声明 // 使用时声明 outData, err := os.">
    <meta name="generator" content="Hugo 0.105.0">
    
    
    
    
      <meta name="robots" content="noindex, nofollow">
    

    
<link rel="stylesheet" href="/ananke/css/main.min.css" >



    
    
    
      

    

    
    
    <meta property="og:title" content="DDE 后端 Tutorial" />
<meta property="og:description" content="dde 后端使用 go 作为主要的开发语言，使用 dbus 提供接口，主要使用 gsettings 来保存配置。所以在进行后端开发前需要对以上内容有基本的了解，这里假定本文档的阅读者熟悉 dbus 和 gsettings ，并有一定的开发经验。
这里就只对 go 进行简单的介绍。
go go 是一种类 c 的语言，但没有了 c 中令人头疼的指针和内存管理问题，极大的提高了开发效率。 go 中使用 package 来封装同一功能的模块，首字母大写的变量和函数是可以被其它 package 使用的。
学习 go 至少需要了解以下内容。
编码风格 go 提供了 gofmt 工具来对代码进行格式化，以使用统一的代码风格。因此在代码保存之前需要使用 gofmt 先进行格式化。
保存前格式化这种操作，一般可在编辑器中配置，如 vim , emacs 等，根据个人习惯选择编辑器。
变量 go 支持使用时声明和使用 var 声明两种方式，如下：
使用 var 声明 // 主动声明 var ( outData []byte err error ) outData, err = os.Exec(&#34;ls&#34;).Output() 使用时声明 // 使用时声明 outData, err := os." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://jouyouyun.github.io/post/dde-daemon-tutorial/" /><meta property="article:section" content="post" />
<meta property="article:published_time" content="2020-03-15T11:38:21+08:00" />
<meta property="article:modified_time" content="2021-04-25T12:57:18+08:00" />

<meta itemprop="name" content="DDE 后端 Tutorial">
<meta itemprop="description" content="dde 后端使用 go 作为主要的开发语言，使用 dbus 提供接口，主要使用 gsettings 来保存配置。所以在进行后端开发前需要对以上内容有基本的了解，这里假定本文档的阅读者熟悉 dbus 和 gsettings ，并有一定的开发经验。
这里就只对 go 进行简单的介绍。
go go 是一种类 c 的语言，但没有了 c 中令人头疼的指针和内存管理问题，极大的提高了开发效率。 go 中使用 package 来封装同一功能的模块，首字母大写的变量和函数是可以被其它 package 使用的。
学习 go 至少需要了解以下内容。
编码风格 go 提供了 gofmt 工具来对代码进行格式化，以使用统一的代码风格。因此在代码保存之前需要使用 gofmt 先进行格式化。
保存前格式化这种操作，一般可在编辑器中配置，如 vim , emacs 等，根据个人习惯选择编辑器。
变量 go 支持使用时声明和使用 var 声明两种方式，如下：
使用 var 声明 // 主动声明 var ( outData []byte err error ) outData, err = os.Exec(&#34;ls&#34;).Output() 使用时声明 // 使用时声明 outData, err := os."><meta itemprop="datePublished" content="2020-03-15T11:38:21+08:00" />
<meta itemprop="dateModified" content="2021-04-25T12:57:18+08:00" />
<meta itemprop="wordCount" content="560">
<meta itemprop="keywords" content="go,dde,daemon,audio,network,power,bluetooth," /><meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="DDE 后端 Tutorial"/>
<meta name="twitter:description" content="dde 后端使用 go 作为主要的开发语言，使用 dbus 提供接口，主要使用 gsettings 来保存配置。所以在进行后端开发前需要对以上内容有基本的了解，这里假定本文档的阅读者熟悉 dbus 和 gsettings ，并有一定的开发经验。
这里就只对 go 进行简单的介绍。
go go 是一种类 c 的语言，但没有了 c 中令人头疼的指针和内存管理问题，极大的提高了开发效率。 go 中使用 package 来封装同一功能的模块，首字母大写的变量和函数是可以被其它 package 使用的。
学习 go 至少需要了解以下内容。
编码风格 go 提供了 gofmt 工具来对代码进行格式化，以使用统一的代码风格。因此在代码保存之前需要使用 gofmt 先进行格式化。
保存前格式化这种操作，一般可在编辑器中配置，如 vim , emacs 等，根据个人习惯选择编辑器。
变量 go 支持使用时声明和使用 var 声明两种方式，如下：
使用 var 声明 // 主动声明 var ( outData []byte err error ) outData, err = os.Exec(&#34;ls&#34;).Output() 使用时声明 // 使用时声明 outData, err := os."/>

	
  </head>

  <body class="ma0 avenir bg-near-white">

    
   
  

  <header>
    <div class="bg-black">
      <nav class="pv3 ph3 ph4-ns" role="navigation">
  <div class="flex-l justify-between items-center center">
    <a href="/" class="f3 fw2 hover-white no-underline white-90 dib">
      
        jouyouyun&#39;s blog
      
    </a>
    <div class="flex-l items-center">
      

      
        <ul class="pl0 mr3">
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/post/" title="Archives 页">
              Archives
            </a>
          </li>
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/tags/" title="Tags 页">
              Tags
            </a>
          </li>
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/categories/" title="Categories 页">
              Categories
            </a>
          </li>
          
        </ul>
      
      
<div class="ananke-socials">
  
    <a href="https://github.com/jouyouyun" target="_blank" class="github ananke-social-link link-transition stackoverflow link dib z-999 pt3 pt0-l mr1" title="GitHub link" rel="noopener" aria-label="follow on GitHub——Opens in a new window">
      
        <span class="icon"><svg style="enable-background:new 0 0 512 512;" version="1.1" viewBox="0 0 512 512"  xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <path d="M256,32C132.3,32,32,134.8,32,261.7c0,101.5,64.2,187.5,153.2,217.9c11.2,2.1,15.3-5,15.3-11.1   c0-5.5-0.2-19.9-0.3-39.1c-62.3,13.9-75.5-30.8-75.5-30.8c-10.2-26.5-24.9-33.6-24.9-33.6c-20.3-14.3,1.5-14,1.5-14   c22.5,1.6,34.3,23.7,34.3,23.7c20,35.1,52.4,25,65.2,19.1c2-14.8,7.8-25,14.2-30.7c-49.7-5.8-102-25.5-102-113.5   c0-25.1,8.7-45.6,23-61.6c-2.3-5.8-10-29.2,2.2-60.8c0,0,18.8-6.2,61.6,23.5c17.9-5.1,37-7.6,56.1-7.7c19,0.1,38.2,2.6,56.1,7.7   c42.8-29.7,61.5-23.5,61.5-23.5c12.2,31.6,4.5,55,2.2,60.8c14.3,16.1,23,36.6,23,61.6c0,88.2-52.4,107.6-102.3,113.3   c8,7.1,15.2,21.1,15.2,42.5c0,30.7-0.3,55.5-0.3,63c0,6.1,4,13.3,15.4,11C415.9,449.1,480,363.1,480,261.7   C480,134.8,379.7,32,256,32z"/>
</svg>
</span>
      
<span class="new-window"><svg  height="8px"  style="enable-background:new 0 0 1000 1000;" version="1.1" viewBox="0 0 1000 1000"  xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
<path d="M598 128h298v298h-86v-152l-418 418-60-60 418-418h-152v-86zM810 810v-298h86v298c0 46-40 86-86 86h-596c-48 0-86-40-86-86v-596c0-46 38-86 86-86h298v86h-298v596h596z" style="fill-rule:evenodd;clip-rule:evenodd;"/>
</svg>
</span></a>
  
</div>

    </div>
  </div>
</nav>

    </div>
  </header>



    <main class="pb7" role="main">
      
  
  <article class="flex-l flex-wrap justify-between mw8 center ph3">
    <header class="mt4 w-100">
      <aside class="instapaper_ignoref b helvetica tracked">
          
        POSTS
      </aside>
      










  <div id="sharing" class="mt3 ananke-socials">
    
  </div>


      <h1 class="f1 athelas mt3 mb1">DDE 后端 Tutorial</h1>
      
      <p class="tracked">
         <strong>jouyouyun</strong>
      </p>
      
      
      
      <time class="f6 mv4 dib tracked" datetime="2020-03-15T11:38:21+08:00">三月 15, 2020</time>
      

      
      
    </header>
    <div class="nested-copy-line-height lh-copy serif f4 nested-links mid-gray pr4-l w-two-thirds-l"><p><code>dde</code> 后端使用 <code>go</code> 作为主要的开发语言，使用 <code>dbus</code> 提供接口，主要使用 <code>gsettings</code> 来保存配置。所以在进行后端开发前需要对以上内容有基本的了解，这里假定本文档的阅读者熟悉 <code>dbus</code> 和 <code>gsettings</code> ，并有一定的开发经验。</p>
<p>这里就只对 <code>go</code> 进行简单的介绍。</p>
<h2 id="go">go</h2>
<p><code>go</code> 是一种类 <code>c</code> 的语言，但没有了 <code>c</code> 中令人头疼的指针和内存管理问题，极大的提高了开发效率。
<code>go</code> 中使用 <code>package</code> 来封装同一功能的模块，首字母大写的变量和函数是可以被其它 <code>package</code> 使用的。</p>
<p>学习 <code>go</code> 至少需要了解以下内容。</p>
<h3 id="编码风格">编码风格</h3>
<p><code>go</code> 提供了 <code>gofmt</code> 工具来对代码进行格式化，以使用统一的代码风格。因此在代码保存之前需要使用 <code>gofmt</code> 先进行格式化。</p>
<p>保存前格式化这种操作，一般可在编辑器中配置，如 <code>vim</code> , <code>emacs</code> 等，根据个人习惯选择编辑器。</p>
<h3 id="变量">变量</h3>
<p><code>go</code> 支持使用时声明和使用 <code>var</code> 声明两种方式，如下：</p>
<h4 id="使用-var-声明">使用 <code>var</code> 声明</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#75715e">// 主动声明
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">var</span> (
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">outData</span> []<span style="color:#66d9ef">byte</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">err</span> <span style="color:#66d9ef">error</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">outData</span>, <span style="color:#a6e22e">err</span> = <span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">Exec</span>(<span style="color:#e6db74">&#34;ls&#34;</span>).<span style="color:#a6e22e">Output</span>()
</span></span></code></pre></div><h4 id="使用时声明">使用时声明</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#75715e">// 使用时声明
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">outData</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">Exec</span>(<span style="color:#e6db74">&#34;ls&#34;</span>).<span style="color:#a6e22e">Output</span>()
</span></span></code></pre></div><p>变量名采用驼峰命名法，首字母小写。</p>
<h3 id="输入-输出">输入/输出</h3>
<p><code>go</code> 中的输入/输出函数跟 <code>c</code> 中的类似，在 <code>fmt</code> 中，具体的请阅读 <code>package fmt</code> 中的代码。</p>
<h3 id="流程控制">流程控制</h3>
<h4 id="if-else">if-else</h4>
<p>同样是与 <code>c</code> 的类似，如：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">num</span> = <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#a6e22e">num</span> &lt; <span style="color:#ae81ff">0</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;num &lt; 0&#34;</span>)
</span></span><span style="display:flex;"><span>} <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">num</span> &gt; <span style="color:#ae81ff">0</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;num &gt; 0&#34;</span>)
</span></span><span style="display:flex;"><span>} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;num == 0&#34;</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="for">for</h4>
<p>同样是与 <code>c</code> 的类似，如：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> <span style="color:#a6e22e">i</span> <span style="color:#f92672">:=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">i</span> &lt; <span style="color:#ae81ff">10</span>; <span style="color:#a6e22e">i</span><span style="color:#f92672">++</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;Index:&#34;</span>, <span style="color:#a6e22e">i</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="switch">switch</h4>
<p><code>go</code> 中的 <code>switch</code> 比 <code>c</code> 中的强大，不向 <code>c</code> 中只能是整型，并且每个 <code>case</code> 语句后不需要 <code>break</code> 语句，示例如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">num</span> = <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">switch</span> <span style="color:#a6e22e">num</span> {
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">1</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;Num is 1&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#ae81ff">2</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;Num is 2&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">default</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;Num is invalid&#34;</span>)
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">str</span> = <span style="color:#e6db74">&#34;hello&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">switch</span> <span style="color:#a6e22e">str</span> {
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#e6db74">&#34;hello&#34;</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;String is hello&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#e6db74">&#34;test&#34;</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;String is test&#34;</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="select">select</h4>
<p>同样是与 <code>c</code> 的类似，如：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">quit</span> = make(<span style="color:#66d9ef">chan</span> <span style="color:#66d9ef">struct</span>{})
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">ticker</span> = <span style="color:#a6e22e">time</span>.<span style="color:#a6e22e">NewTicker</span>(<span style="color:#a6e22e">time</span>.<span style="color:#a6e22e">Second</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">3</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">select</span> {
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#f92672">&lt;-</span><span style="color:#a6e22e">ticker</span>.<span style="color:#a6e22e">C</span>:
</span></span><span style="display:flex;"><span>         <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;Ticker recieved&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#f92672">&lt;-</span><span style="color:#a6e22e">quit</span>:
</span></span><span style="display:flex;"><span>         <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;Quit...&#34;</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><hr>
<p>另外 <code>go</code> 中不支持 <code>while</code> 语句，但支持 <code>break</code> 和 <code>goto</code> 语句。</p>
<h3 id="函数">函数</h3>
<p><code>go</code> 中的函数定义如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>func 函数名<span style="color:#f92672">(</span>形式参数列表<span style="color:#f92672">)(</span>返回值列表<span style="color:#f92672">){</span>
</span></span><span style="display:flex;"><span>    函数体
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p><code>go</code> 中的函数支持多返回值，这一点是与 <code>c</code> 中不同的。</p>
<p>其他的就与 <code>c</code> 相同。</p>
<h3 id="异常处理">异常处理</h3>
<p><code>go</code> 中可用 <code>panic</code> 函数让程序崩溃，也可使用 <code>recover</code> 函数捕获此次崩溃信息，让程序继续执行.</p>
<h3 id="协程">协程</h3>
<p><code>go</code> 中并发使用协程处理，使用 <code>go</code> 关键词即可开启一个协程，如：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#75715e">// 开启10个协程
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">for</span> <span style="color:#a6e22e">i</span><span style="color:#f92672">:=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">i</span> &lt; <span style="color:#ae81ff">10</span>; <span style="color:#a6e22e">i</span><span style="color:#f92672">++</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">go</span> <span style="color:#66d9ef">func</span>(<span style="color:#a6e22e">idx</span> <span style="color:#66d9ef">int</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">&#34;In index:&#34;</span>, <span style="color:#a6e22e">i</span>)
</span></span><span style="display:flex;"><span>        }(<span style="color:#a6e22e">i</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="package">package</h3>
<p><code>go</code> 提供了丰富的标准库，至少需要熟悉以下 <code>package</code> ：</p>
<ul>
<li><code>fmt</code></li>
<li><code>flag</code></li>
<li><code>errors</code></li>
<li><code>strings</code></li>
<li><code>strconv</code></li>
<li><code>io</code></li>
<li><code>io/ioutil</code></li>
<li><code>bytes</code></li>
<li><code>bufio</code></li>
<li><code>path</code></li>
<li><code>path/filepath</code></li>
<li><code>os</code></li>
<li><code>os/exec</code></li>
<li><code>sort</code></li>
<li><code>time</code></li>
</ul>
<hr>
<hr>
<p>关于 <code>go</code> 的内容就先介绍这些，后续希望能够自己去学习，官网提供的有文档。</p>
<p>接下来开始介绍后端的内容。</p>
<h2 id="dde-后端">DDE 后端</h2>
<p>首先介绍后端包含的项目：</p>
<ul>
<li>
<p><a href="https://gitlab.deepin.io/dde-v20/deepin-desktop-schemas">deepin-desktop-schemas</a></p>
<p>存储后端配置，使用 <code>gsettings</code> 存储</p>
</li>
<li>
<p><a href="https://gitlab.deepin.io/github-linuxdeepin-mirror/go-gir-generator">go-gir-generator</a></p>
<p>对 <code>glib2.0</code> 的 <code>go</code> 绑定， <code>gsettings</code> 的接口就是其提供的</p>
</li>
<li>
<p><a href="https://gitlab.deepin.io/dde-v20/go-lib">go-lib</a></p>
<p>后端封装的常用功能 <code>package</code> ，要求能够熟练使用里面的每个 <code>package</code> ，例如 <code>dbus</code> 服务是由 <code>dbus1</code> 和 <code>dbusutils</code> 两个 <code>package</code> 提供的。</p>
<p>使用时需将 <code>/usr/share/gocode</code> 加入到 <code>GOPATH</code> 变量中，然后导入：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span> <span style="color:#f92672">import</span> (
</span></span><span style="display:flex;"><span>         <span style="color:#e6db74">&#34;pkg.deepin.io/lib/dbus1&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">&#34;pkg.deepin.io/lib/dbus1&#34;</span>
</span></span><span style="display:flex;"><span>)
</span></span></code></pre></div></li>
<li>
<p><a href="https://gitlab.deepin.io/dde-v20/go-x11-client">go-x11-client</a></p>
<p>对 <code>xcb</code> 接口的绑定，涉及 <code>x</code> 的操作需要了解</p>
</li>
<li>
<p><a href="https://gitlab.deepin.io/dde-v20/go-dbus-factory">go-dbus-factory</a></p>
<p>后端对常用的 <code>dbus</code> 服务的封装，可直接方便的调用对应 <code>dbus</code> 服务的接口。</p>
</li>
<li>
<p><a href="https://gitlab.deepin.io/dde-v20/dde-api/">dde-api</a></p>
<p>对桌面级模块的封装，并一共一些非常驻内存的程序</p>
</li>
<li>
<p><a href="https://gitlab.deepin.io/dde-v20/dde-daemon">dde-daemon</a></p>
<p>常驻内存的服务，主要分为系统级服务和用户级服务，即 <code>dde-system-daemon</code> 和 <code>dde-session-daemon</code></p>
</li>
<li>
<p><a href="https://gitlab.deepin.io/dde-v20/startdde/">startdde</a></p>
<p>桌面的启动程序，启动整个桌面环境，按照指定的顺序启动桌面组件，并提供显示接口</p>
</li>
</ul>
<p>上面是对后端所涉及的项目做了简单的介绍，下面会重点介绍一些关键的。</p>
<h3 id="startdde">startdde</h3>
<p>做后桌面的启动程序，必须保证稳定和尽可能的简洁，所以不是启动阶段需要的功能都不要放入此项目中。此项目包含的功能如下：</p>
<h4 id="启动显示服务">启动显示服务</h4>
<p>启动显示服务，为桌面提供显示相关接口，主要用于分辨率、刷新率和多屏设置</p>
<h4 id="xsettings">xsettings</h4>
<p>启动 <code>xsettings manager</code> 用于主题、字体和 <code>dpi</code> 等的设置</p>
<h4 id="窗管启动">窗管启动</h4>
<p>通过检查硬件环境或用户的配置来决定启动特效模式或是普通模式的窗管</p>
<h4 id="桌面组建启动">桌面组建启动</h4>
<p>提供了配置文件 <code>/usr/share/startdde/auto_launch.json</code> 来定义桌面组建的启动顺序，对于需要在 <code>autostart</code> 之前启动的程序需要加入这个配置文件中。</p>
<h4 id="autostart">autostart</h4>
<p>扫描系统的 <code>autostart</code> 目录下的 <code>desktop</code> 文件，并将其启动</p>
<h4 id="应用启动接口">应用启动接口</h4>
<p>提供应用启动的接口， <code>dde-dock, dde-launcher, dde-desktop</code> 会使用</p>
<h4 id="watchdog">watchdog</h4>
<p>启动 <code>watchdog</code> 服务，进听重要的桌面组件是否存在，如果不存在就将其启动</p>
<hr>
<p>以上就是 <code>startdde</code> 提供的主要功能，具体实现请自行阅读代码。</p>
<h3 id="dde-daemon">dde-daemon</h3>
<p><code>dde-daemon</code> 中主要分为 <code>dde-system-daemon</code> 和 <code>dde-session-daemon</code> 两个服务，将分别介绍。</p>
<h4 id="dde-system-daemon">dde-system-daemon</h4>
<p>本服务主要提供系统级服务，即需要 <code>root</code> 权限的和与用户无关的接口，包含的主要功能如下：</p>
<!-- raw HTML omitted -->
<ul>
<li>
<p>accounts</p>
<p>提供用户管理的功能和接口，对应控制中心的账户模块。</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>apps</p>
<p>提供应用信息启动次数，系统中应用变更监听的功能和接口， <code>dde-dock</code> 和 <code>dde-launcher</code> 会用到。</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>fprintd</p>
<p>对 <code>fprintd</code> 接口的封装，提供开源的指纹接口，计划废弃</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>image_effect</p>
<p>提供图片模糊的功能和接口</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>gesture</p>
<p>使用 <code>libinput</code> 的接口监听触摸板和触摸屏的事件，发送触摸板手势信号和触摸板长按信号。</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>network</p>
<p>提供一些需要 <code>root</code> 权限操作的网络接口</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>power</p>
<p>提供电池的信息的功能和接口，以及一些通用的电源接口</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>timedated</p>
<p>时间日期管理的服务和接口</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>airplane_mode</p>
<p>飞行模式的接口</p>
</li>
</ul>
<h4 id="dde-session-daemon">dde-session-daemon</h4>
<p>用户级的服务接口，主要供控制中心使用，包含的功能如下：</p>
<!-- raw HTML omitted -->
<ul>
<li>
<p>dock</p>
<p>主要为 <code>dde-dock</code> 提供所需接口</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>trayicon</p>
<p>托盘应用的管理接口</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>x_event_monitor</p>
<p>提供统一的按键、鼠标移动和鼠标点击事件的监听程序</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>network</p>
<p>提供当前网络功能的接口，包括设备数量、连接状态、无线接入点等</p>
<p>网络服务的实际功能由 <code>NetworkManager</code> 提供</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>audio</p>
<p>提供声音相关的接口，被 <code>dde-dock</code> 和  <code>dde-control-center</code> 使用</p>
<p>声音功能实际由 <code>pulseaudio</code> 提供</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>screensaver</p>
<p>基于 <code>org.freedesktop.Screensaver</code> 标准实现的接口，主要提供 <code>x</code> 中 <code>idle</code> 超时的设置，供其他模块使用</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>sessionwatcher</p>
<p>监听当前 <code>session</code> 的改变，对变为非激活的 <code>session</code> 时禁用一些功能</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>power</p>
<p>为 <code>dde-dock</code> 和 <code>dde-control-center</code> 提供接口，实现电源设置里待机、黑屏等功能</p>
<p>电源信息由 <code>upower</code> 提供</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>launcher</p>
<p>为 <code>dde-launcher</code> 提供接口，包括应用列表、应用排序、应用卸载等功能</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>keybinding</p>
<p>桌面全局快捷键绑定的功能，以及快捷键更改、自定义快捷键等功能</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>appearance</p>
<p>主题、字体和缩放等功能的接口</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>inputdevices</p>
<p>输入输出设备的配置接口，如鼠标、键盘、触摸板等设备的配置</p>
<p>设备的配置是通过配置 <code>xorg</code> 上提供的设备属性来完成的，也可使用 <code>xinput</code> 配置</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>gesture</p>
<p>接受系统级 <code>gesture</code> 服务的信号，做出对应的处理</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>housekeeping</p>
<p>检查 <code>home</code> 目录空间是否充足，不足时提示用户</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>timedate</p>
<p>时间日期设置的接口</p>
<p>实际设置接口由 <code>systemd-timedatectl</code> 提供</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>bluetooth</p>
<p>蓝牙服务的接口，封装的是  <code>bluez</code> 的接口</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>systeminfo</p>
<p>系统信息的接口，如 <code>cpu</code> 、内存、存储、版本等</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>calltrace</p>
<p>生成调试所需 <code>calltrace</code> 的动态接口，用于调试内存泄漏和 <code>cpu</code> 占用</p>
</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>
<p>debug</p>
<p>动态开启 <code>debug</code> 日志的接口</p>
<hr>
<p>到此基本完成对 <code>dde-daemon</code> 的介绍，想要详细了解还是需要去看代码。</p>
</li>
</ul>
<h2 id="调试方法">调试方法</h2>
<p>后端的所有项目都要求使用 <code>pkg.deepin.io/lib/log</code> 这个 <code>package</code> 提供日志功能，所以都可以通过 <code>DDE_DEBUG_LEVEL</code> 这个环境变量来修改日志级别，如改为 <code>debug</code> 级别：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>export DDE_DEBUG_LEVEL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;debug&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 然后在启动程序</span>
</span></span></code></pre></div><p>也可动态的开启 <code>debug</code> 日志，如：</p>
<ul>
<li>
<p><code>startdde</code></p>
<p><code>qdbus --literal com.deepin.SessionManager /com/deepin/SessionManager com.deepin.SessionManager.ToggleDebug</code></p>
</li>
<li>
<p><code>dde-session-daemon</code></p>
<p><code>gsettings set com.deepin.dde.daemon debug true</code></p>
<p>启用 <code>debug</code> 模块，如果不再需要，需要手动关闭，即设为  <code>false</code></p>
</li>
</ul>
<p>关于 <code>dde-daemon</code> 更多调试相关的，请参见 <code>docs/dde-session-daemon_debug.md</code> 文件</p>
<ul class="pa0">
  
   <li class="list di">
     <a href="/tags/go" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">go</a>
   </li>
  
   <li class="list di">
     <a href="/tags/dde" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">dde</a>
   </li>
  
   <li class="list di">
     <a href="/tags/daemon" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">daemon</a>
   </li>
  
   <li class="list di">
     <a href="/tags/audio" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">audio</a>
   </li>
  
   <li class="list di">
     <a href="/tags/network" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">network</a>
   </li>
  
   <li class="list di">
     <a href="/tags/power" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">power</a>
   </li>
  
   <li class="list di">
     <a href="/tags/bluetooth" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">bluetooth</a>
   </li>
  
</ul>
<div class="mt6 instapaper_ignoref">
      
      
      </div>
    </div>

    <aside class="w-30-l mt6-l">




  <div class="bg-light-gray pa3 nested-list-reset nested-copy-line-height nested-links">
    <p class="f5 b mb3">相关內容</p>
    <ul class="pa0 list">
	   
	     <li  class="mb2">
          <a href="/post/linux_hardware_info/">Linux 硬件信息获取</a>
        </li>
	    
	     <li  class="mb2">
          <a href="/post/go-package-management/">Go 包管理之gom</a>
        </li>
	    
	     <li  class="mb2">
          <a href="/post/bluetooth-faq/">Bluetooth FAQ</a>
        </li>
	    
	     <li  class="mb2">
          <a href="/post/go-tcp-socket-example/">Go 笔记: 简单的 TCP Socket 示例</a>
        </li>
	    
	     <li  class="mb2">
          <a href="/post/go-gob-rw-file/">Go 笔记: Gob Write/Read File</a>
        </li>
	    
	     <li  class="mb2">
          <a href="/post/go-md5-sum/">Go 笔记: md5 sum</a>
        </li>
	    
	     <li  class="mb2">
          <a href="/post/go-file-exist/">Go 笔记: 判断文件是否存在</a>
        </li>
	    
	     <li  class="mb2">
          <a href="/post/go-uri-encode/">Go 笔记: URI Encode/Decode</a>
        </li>
	    
    </ul>
</div>

</aside>

  </article>

    </main>
    <footer class="bg-black bottom-0 w-100 pa3" role="contentinfo">
  <div class="flex justify-between">
  <a class="f4 fw4 hover-white no-underline white-70 dn dib-ns pv2 ph3" href="https://jouyouyun.github.io" >
    &copy;  jouyouyun 2023 
  </a>
    <div>
<div class="ananke-socials">
  
    <a href="https://github.com/jouyouyun" target="_blank" class="github ananke-social-link link-transition stackoverflow link dib z-999 pt3 pt0-l mr1" title="GitHub link" rel="noopener" aria-label="follow on GitHub——Opens in a new window">
      
        <span class="icon"><svg style="enable-background:new 0 0 512 512;" version="1.1" viewBox="0 0 512 512"  xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <path d="M256,32C132.3,32,32,134.8,32,261.7c0,101.5,64.2,187.5,153.2,217.9c11.2,2.1,15.3-5,15.3-11.1   c0-5.5-0.2-19.9-0.3-39.1c-62.3,13.9-75.5-30.8-75.5-30.8c-10.2-26.5-24.9-33.6-24.9-33.6c-20.3-14.3,1.5-14,1.5-14   c22.5,1.6,34.3,23.7,34.3,23.7c20,35.1,52.4,25,65.2,19.1c2-14.8,7.8-25,14.2-30.7c-49.7-5.8-102-25.5-102-113.5   c0-25.1,8.7-45.6,23-61.6c-2.3-5.8-10-29.2,2.2-60.8c0,0,18.8-6.2,61.6,23.5c17.9-5.1,37-7.6,56.1-7.7c19,0.1,38.2,2.6,56.1,7.7   c42.8-29.7,61.5-23.5,61.5-23.5c12.2,31.6,4.5,55,2.2,60.8c14.3,16.1,23,36.6,23,61.6c0,88.2-52.4,107.6-102.3,113.3   c8,7.1,15.2,21.1,15.2,42.5c0,30.7-0.3,55.5-0.3,63c0,6.1,4,13.3,15.4,11C415.9,449.1,480,363.1,480,261.7   C480,134.8,379.7,32,256,32z"/>
</svg>
</span>
      
<span class="new-window"><svg  height="8px"  style="enable-background:new 0 0 1000 1000;" version="1.1" viewBox="0 0 1000 1000"  xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
<path d="M598 128h298v298h-86v-152l-418 418-60-60 418-418h-152v-86zM810 810v-298h86v298c0 46-40 86-86 86h-596c-48 0-86-40-86-86v-596c0-46 38-86 86-86h298v86h-298v596h596z" style="fill-rule:evenodd;clip-rule:evenodd;"/>
</svg>
</span></a>
  
</div>
</div>
  </div>
</footer>

  </body>
</html>
